// #pragma once
/*
 *   通⽤功能类，与业务⽆关的功能实现
 *   1. 获取系统时间戳
 *   2. 获取⽂件⼤⼩
 *   3. 创建⽬录
 *   4. 获取⽂件所在⽬录
 */
#include <iostream>
#include <string>
#ifdef __cplusplus >= 201703L
#include <filesystem>
#endif
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
namespace loggger
{
    namespace base
    {
        class TimeUtil
        {
        public:
            // 获取当前系统时间戳
            static size_t now()
            {
                return static_cast<size_t>(time(nullptr));
            }
        };
#if __cplusplus >= 201703L
        namespace fs = std::filesystem;
        class FileUtil
        {
        public:
            // 判断一个文件是否存在
            static bool exists(const std::string &filename)
            {
                std::error_code err;
                return fs::exists(filename, err);
            }
            //获取文件所处目录
            //不会在末尾添加/
            static std::string path(const std::string &filename)
            {
                fs::path p(filename);
                if (!p.is_absolute())
                    return std::string();
                return p.parent_path();
            }
            // 成功返回文件实际的大小
            // 失败返回-1
            static size_t file_size(const std::string &filename)
            {
                std::error_code err;
                // path 重载了string转换
                size_t size = static_cast<size_t>(fs::file_size(filename, err));
                if (err) return -1;
                return size;
            }
            // 如果目录存在则什么也不做
            // 如果目录不存在则创建，默认赋予读写权限
            static void create_dir(const std::string &dirpath)
            {
                if (exists(dirpath))
                    return;
                std::error_code err;
                // 递归式的创建目录
                fs::create_directories(dirpath, err);
            }
        };
#else
        class FileUtil
        {
        public:
            // 判断一个文件是否存在
            static bool exists(const std::string &filename)
            {
                struct stat st;
                return stat(filename.c_str(), &st) == 0;
            }
            // 获取文件所处目录
            static std::string path(const std::string &name)
            {
                if (name.empty()) return ".";
                size_t pos = name.find_last_of("/\\");
                if (pos == std::string::npos) return ".";
                return name.substr(0,pos+1);
            }
            // 成功返回文件实际的大小
            // 失败返回-1
            static size_t file_size(const std::string &filename)
            {
                struct stat file_info;
                if (::stat(filename.c_str(), &file_info) == -1)
                {
                    return -1;
                }
                // 检查是否为普通文件（避免目录等特殊文件）
                if (!S_ISREG(file_info.st_mode))
                {
                    return -1;
                }
                return static_cast<size_t>(file_info.st_size);
            }
            // 如果目录存在则什么也不做
            // 如果目录不存在则创建，默认赋予读写权限
            // 只能创建单个目录!--建议升级c++17
            static bool create_dir(const std::string &dir, int mode = 0755)
            {
                if (exists(dir))
                    return;
                if (::mkdir(dir.c_str(), mode) == -1)
                {
                    return false;
                }
                return true;
            }
        };
#endif
    }
}
